import i18n from '@/i18n'
import useStore from '@/stores'

/**
 *  子节点为空转为数组
 * @param  data
 */
export function handleChildreNode(data) {
    // 如果 children 不是数组，则转换为空数组
    if (!Array.isArray(data)) {
        data = []
    }
    data.forEach((element) => {
        if (element.children === null || element.children === undefined) {
            element.children = []
        }
        // 递归处理子节点
        if (element.children && Array.isArray(element.children)) {
            handleChildreNode(element.children)
        }
    })
}
/**
 *  实现把后端数据转为el-tree-select需要的格式
 * @param data 树形数据
 */
export function handleAttributes(data) {
    data.forEach((element) => {
        element.label = element.name
        element.value = element.id
        if (element.children) {
            handleAttributes(element.children)
        }
    })
}

/**
 *  翻译处理
 * @param data 树形数据
 */
export function handleTranslate(data) {
    // 如果 children 不是数组，则转换为空数组
    if (!Array.isArray(data)) {
        data = []
    }
    data.forEach((element) => {
        element.name = i18n.global.t(element.name)
        element.label = i18n.global.t(element.label)
        // 递归处理子节点
        if (element.children && Array.isArray(element.children)) {
            handleTranslate(element.children)
        }
    })
}

/**
 * 检查用户是否拥有指定权限
 *
 * @param {string|Array<string>} input - 需要检查的权限，可以是单个权限字符串或权限数组
 * @returns {boolean} - 如果用户拥有所有指定权限则返回true，否则返回false
 *
 * @example
 *  检查单个权限
 * hasPermission('user.create');
 *
 * @example
 *  检查多个权限
 * hasPermission(['user.create', 'user.delete']);
 */
export function hasPermission(input) {
    const { user } = useStore()

    // 空值处理
    if (!input) return false

    // 数组处理：检查用户是否拥有所有指定权限
    if (Array.isArray(input)) {
        return (
            input.length > 0 && input.every((permission) => user?.permissions?.includes(permission))
        )
    }

    // 字符串处理：检查用户是否拥有指定权限
    return user?.permissions?.includes(input)
}

/**
 * 检查当前用户是否拥有指定的角色
 *
 * 该函数根据用户存储中的角色信息与输入角色进行比对，支持三种情况：
 * 1. 空值输入：直接返回 false
 * 2. 数组输入：仅当用户拥有所有指定角色时返回 true（逻辑与）
 * 3. 字符串输入：当用户拥有指定角色时返回 true
 *
 * @param {string|Array<string>} input - 需要检查的角色，可以是：
 *   - 单个角色字符串
 *   - 角色数组（需要全部拥有）
 *   - 空值（undefined/null/空字符串）将返回false
 * @returns {boolean}
 *   - true 表示用户拥有所需角色
 *   - false 表示输入为空、用户无角色或缺少所需角色
 *
 * @example
 *  检查单个角色
 * hasRole('管理员')
 *
 * @example
 *  检查多个角色（需全部满足）
 * hasRole(['管理员', '编辑员'])
 */
export function hasRole(input) {
    // 从store中获取用户数据
    const { user } = useStore()

    // 空值处理：输入为空时直接返回false
    if (!input) return false

    // 数组处理：检查用户是否拥有数组中的所有角色
    if (Array.isArray(input)) {
        return (
            input.length > 0 && // 确保数组非空
            input.every((role) => user?.roles?.includes(role)) // 检查每个角色
        )
    }

    // 字符串处理：检查用户是否拥有指定角色
    return user?.roles?.includes(input)
}
